package com.speed.service.help;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.jfinal.kit.StrKit;
import com.speed.entity.Activiter;
import com.speed.service.ActiviterService;
import com.speed.util.ecxel.TempData;
import com.speed.vo.ActiviterVO;

public class ActiviterImportHelper {

	private ActiviterService service;

	/**
	 * 应该在进入后台管理页面选择所需要管理的活动
	 */
	// 当前选择的活动ID
	private Integer activitesId;

	private List<ActiviterVO> vos = new ArrayList<ActiviterVO>();
	private boolean ok;

	public ActiviterImportHelper(List<TempData> tempDatas, ActiviterService _service, Integer _activitesId) {
		service = _service;
		activitesId = _activitesId;
		init(tempDatas);

	}

	/**
	 * 加载数据变换为 VO
	 * 
	 * @param tempDatas
	 */
	private void init(List<TempData> tempDatas) {
		int serialNo = 0;
		for (TempData t : tempDatas) {
			serialNo++;
			Map<String, Object> data = t.getData();
			String name = (String) data.get("name");
			String mobile = (String) data.get("mobile");
			String sex = (String) data.get("sex");
			String enterprise = (String) data.get("enterprise");
			ActiviterVO vo = new ActiviterVO();
			vo.setSerialNo(serialNo);
			vo.setName(name);
			vo.setMobile(mobile);
			vo.setSex(getSex(sex));
			vo.setEnterprise(enterprise);
			// 初始化简单检验手机号是否正确
			checkMobileStep1(name, mobile, vo);
			vos.add(vo);
		}
		checkMobileStep2();

		checkMobileStep3();
	}

	private Integer getSex(String sexStr) {
		if (StrKit.notBlank(sexStr)) {
			if (sexStr.equals("男")) {
				return 0;
			}
			if (sexStr.equals("女")) {
				return 1;
			}
			// 都不符合即返回null
			return null;
		}
		return null;
	}

	public boolean isFinished() {
		return ok;
	}

	/**
	 * 检查手机号码是否长度正确
	 * 
	 * @param mobile
	 * @param vo
	 */
	private void checkMobileStep1(String name, String mobile, ActiviterVO vo) {

		if (StrKit.isBlank(name)) {
			vo.setErrContent("姓名不能为空;");
			vo.setStatus("0");
		}

		if (StrKit.isBlank(mobile)) {
			vo.setErrContent("手机号码不能空;");
			vo.setStatus("0");
		} else if (mobile.length() > 11) {
			vo.setErrContent("手机号码大于11位;");
			vo.setStatus("0");
		} else if (mobile.length() < 11) {
			vo.setErrContent("手机号码小于11位;");
			vo.setStatus("0");
		}
	}

	/**
	 * 第2步: 筛选导入的数据是否出现重复，或者同手机不同姓名
	 */
	private void checkMobileStep2() {
		for (ActiviterVO vo : vos) {
			// 跳过检验自己本身
			int skip = vos.indexOf(vo);
			for (int i = 0; i < vos.size(); i++) {
				if (skip == i) {
					continue;
				}
				ActiviterVO vo2 = vos.get(i);
				// 如果手机相同校验，名字
				if (vo.getMobile().equals(vo2.getMobile())) {
					if (vo.getName().equals(vo2.getName())) {
						vo2.setErrContent("手机和姓名出现重复与" + vo.getSerialNo() + "行一致;");
					} else {
						vo2.setErrContent("手机重复,但是与" + vo.getSerialNo() + "行姓名不一致;");
					}
					vo2.setStatus("0");
				}
			}
		}
	}

	/**
	 * 第3步检查手机+人名是否出现重复或者人名变更
	 */
	private void checkMobileStep3() {

		// 找出第一步没有错误的数据列
		List<ActiviterVO> checkVOs = new ArrayList<ActiviterVO>();
		List<String> mobiles = new ArrayList<String>();
		for (ActiviterVO vo : vos) {
			if (StrKit.isBlank(vo.getErrContent())) {
				checkVOs.add(vo);
				mobiles.add(vo.getMobile());
			}
		}
		System.out.println("[Before mobiles]" + mobiles);
		// 根据手机号查询所有对应的活动人数据，当前活动
		List<Activiter> activiters = service.findActiviterByMobiles(mobiles, activitesId, Activiter.ACTIVITER_NAME,
				Activiter.ACTIVITER_MOBILE);
		if (activiters != null) {
			for (Activiter a : activiters) {
				String mobile = a.get(Activiter.ACTIVITER_MOBILE);
				String name = a.get(Activiter.ACTIVITER_NAME);
				// 根据下标查询对应的检查
				ActiviterVO vo = checkVOs.get(mobiles.indexOf(mobile));
				String voName = vo.getName();
				vo.setStatus("0");
				if (!voName.equals(name)) {
					vo.setErrContent("手机对应的姓名不符&手机重复");
				} else {
					vo.setErrContent("手机号重复;");
				}
				// 删除重复的手机
				mobiles.remove(mobile);
				checkVOs.remove(vo);
			}
		}
		System.out.println("[After mobiles]" + mobiles);
		// 处理正确的信息
		for (ActiviterVO vo : checkVOs) {
			vo.setErrContent("导入信息正确");
			vo.setStatus("1");
		}
	}

	/**
	 * 返回
	 * 
	 * @param status
	 * @return
	 */
	public List<ActiviterVO> getVosByStatus(String status) {
		List<ActiviterVO> result = new ArrayList<ActiviterVO>();
		for (ActiviterVO vo : vos) {
			if (status.equals(vo.getStatus())) {
				result.add(vo);
			}
		}
		return result;
	}

}
